package Testdemo4;

import javax.swing.*;
import java.awt.*;
import java.util.Arrays;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;



/**
 * Created with IntelliJ IDEA.
 * Description:
 * User:周次煜
 * Date: 2024-05-24
 * Time：11:55
 */
public class Test1 {

    /**
     * 汉明距离
     *
     *
     * @param x 值一
     * @param y 值二
     * @return 返回汉明距离
     */

        public int hammingDistance(int x, int y) {

            // 先讲 两个值进行按位异或
            int t=x^y;


            int ret=0;

            // 循环检查 1 的个数就是汉明距离的个数
            for(int i = 0; i < 32;i++) {
                if(((t >> i) & 1) == 1) ret++;
            }


            return ret;
        }


    /**
     *
     * 判断字符是否唯一
     *
     * 利用哈希表思想
     * @param astr 字符串
     * @return 返回 Boolean 类型
     *
     */

    public boolean isUnique(String astr) {
        int s= astr.length();
        char[] chs= new char[27];
        for(int i = 0; i < s; ++i) {

            char ch =  astr.charAt(i);

            chs[ch-'a']++;

        }

        for(int j=0; j < s; ++j) {
            char ch = astr.charAt(j);
            if(chs[ch-'a'] > 1) {
                return false;
            }
        }

        return true;
    }


    /**
     *  判断字符串是否唯一
     *
     *  方法二 ： 位图
     *  利用比特位上的位置
     *
     *  只要出现了 1 就说明存在
     *
     *  本身 是 0 就说明不存在
     *
     * @param astr
     * @return
     */

    public boolean isUnique2(String astr) {
        int s= astr.length();

        // 利用 鸽巢原理
        if(s > 26) return false;

        // 创建一个位图
        int  bitMap=0;
        for(int i = 0; i < s; ++i) {
            char ch = astr.charAt(i);
            if(((bitMap >> (ch-'a')) & 1) == 1) {
                return false ;
            } else {
                bitMap |=  (1 << (ch-'a'));
            }

        }

        return true;
    }


    /**
     * 动态规划
     * 最小花费爬楼梯
     * @param cost 花费的值
     * @return 返回最小花费
     *
     */




    public int minCostClimbingStairs(int[] cost) {
        //方法一： 以动态值为尾端

        // 定义一个动态转移方程
        int n = cost.length;
        int []dp = new int[n+1];




        // 进行初始化动态方程
        dp[0]=dp[1]=0;

        // 因为是 从 0 或 1 台阶开始跳动
        // 动态转移方程从从跳动后的那个位置开始计费
        for(int i=2; i < n + 1 ; i++) {
            // 书写动态转移方程的推导式
            dp[i] = Math.min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
        }


        return dp[n];
    }


    /**
     * 用位运算得到两个整数相加
     *
     * 分别取出这两个数的无符号进位
     *  和 有符号进位
     *  循环进行上述操作
     *
     * @param a 值一
     * @param b 值二
     * @return 返回两个值的和
     */

    public int getSum(int a, int b) {

        // 进位数
        int carry= 1;

        //无进位数
        int noCarry= 0;
        // 当我们得到的进位数 为 0 时
        // 说明已经把所有的进位 用 ^ 给 填上，最终 用 & 舍掉
        while(carry != 0) {

            // 进行无符号进位
            noCarry = a^b;

            // 进位并且左移动 一位得到进位数
            carry = b = ((a&b) << 1);
            a = noCarry;
        }

        // 最终得到总和
        return a;
    }



    public static void main(String[] args) {
        int[] array= new int[]{2};
        System.out.println(Arrays.toString(missingTwo(array)));
    }

    /**
     * 寻找两个消失的数
     *
     * 方法一：
     * 同时异或
     * @param nums 目标数组
     * @return 返回两个消失的数的数组
     *
     */



    public static int[] missingTwo(int[] nums) {
        int[] ret = new int[2];

        int n= nums.length;
        int xor=0;

        // 先进行异或
        for(int i =0; i < n ; i++) {
            xor ^= nums[i];
            xor ^= (i+1);
        }

        // 异或比数组长1 和长2 的数
        xor ^= n+1;
        xor ^= n+2;

        // 寻找比特位不同的位置
        // 即寻找 xor为 1 的位置

        int index= 0;
        for (int i=0; i < 32 ; i++) {
            if (((xor >> i) & 1)==1) {
                index = i;
                break;
            }
        }


        // 先对数组中的元素和  数组下标+1 的值 进行异或
        // 进行分组
        for(int i = 0; i < n; i++) {

            // 在区分位上进行判断

            // 该位置为 1 就进入该组
            if((( nums[i] >> index ) & 1 ) ==1) {
                ret[0] ^= nums[i];
            } else {
                ret[1] ^= nums[i];
            }

            // 该位置为 2 就进入该组
            if((( (i+1) >> index ) & 1 ) ==1) {
                ret[0] ^=  (i+1);
            } else {
                ret[1] ^= (i+1);
            }
        }


        // 最后再判断多出来的两位数字
        if((( (n+1) >> index ) & 1 ) ==1) {
            ret[0] ^=  (n+1);
        } else {
            ret[1] ^= (n+1);
        }

        // 再异或后面多出来的数字
        if((( (n+1) >> index ) & 1 ) ==1) {
            ret[0] ^=  (n+2);
        } else {
            ret[1] ^= (n+2);
        }


        return ret;
    }

    /**
     *
     * 寻找缺失的两个数字
     * 方法二 ： 分别用 两个for 循环 异或这个数组元素 和 0 ~ N
     *
     * @param nums 含义部分 0~N 的数字的数组
     *
     * @return 返回缺失两个缺失数字的数组
     */


    public int[] missingTwo1(int[] nums) {
        int[] ret = new int[2];

        int n= nums.length;
        int xor=0;

        // 先对数组元素进行异或
        for(int i =0; i < n ; i++) {
            xor ^= nums[i];

        }


        // 再对整数范围异或
        for(int i=1; i <= n+2 ; i++) {
            xor ^= i;
        }




        // 寻找比特位不同的位置
        // 即寻找 xor为 1 的位置

        int index= 0;
        for (int i=0; i < 32 ; i++) {
            if (((xor >> i) & 1)==1) {
                index = i;
                break;
            }
        }


        // 先对数组中的元素异或和
        // 进行分组
        for(int i = 0; i < n; i++) {

            // 在区分位上进行判断


            if(((nums[i] >> index ) &  1) ==1){
                //比特位上 index 位置为 1 就进入该组
                ret[0] ^= nums[i];
            } else {
                // 为 0 进入该组
                ret[1] ^= nums[i];
            }

        }


        for(int i=1 ; i <= n + 2 ; i++) {
            if(((i >> index ) &  1) ==1) {
                //比特位上 index 位置为 1 就进入该组
                ret[0] ^= i;
            } else {
                // 为 0 进入该组
                ret[1] ^= i;
            }

        }


        return ret;
    }






    /**
     * 寻找只出现一次的数
     *
     *
     * @param nums 含有 3个数字 和 单独数字的数组
     * @return 返回该单独的数字
     */

    public static int singleNumber(int[] nums) {
        int n = nums.length;


        int ret=0;
        for(int i = 0; i < 32 ; i++) {

            // 得到位图上每一个的 总和
            int bitSum= 0;
            for(int j=0; j < n; j++) {
                bitSum += ((nums[j] >> i) & 1) ;

            }

            //  得到每一位上比特位的值判断
            // 扩展：
            // 出现 n 次的数字 ， 就bitSum % n
            int cur = bitSum % 3;

            // 只要这个位置的值 为 1
            if(cur == 1) {
                // 就修改当前的位置值 为 1
                ret |= (1 << i);
            }
        }


        return ret;

    }


    /**
     * 解码方案
     *、
     * 分两种情况
     * 1. 能否独立解码
     * 2. 能否联合解码
     *
     * @param s 需要解码的字符串
     * @return 返回解码的种类
     *
     */

    public int numDecodings(String s) {

        int  n= s.length();


        // 定义一个转态转移方程
        // 优化版本 定义一个 n+1
        int[] dp = new int[n+1];

        // 处理边界情况
        dp[0] = 1;

        // 进行初始化
        char ch0 = s.charAt(0);


        // 初始化 dp[0]
        if(ch0=='0') {
            // 解码失败
            dp[1]=0;
        } else {
            // 解码成功
            dp[1]=1;
        }


        // 当数组长度为 1 的特殊情况
        if(n == 1) return dp[1];




        // 进行转态转移
        for(int i = 2; i <= n; i++) {
            ch0 = s.charAt(i-2);
            char  ch1 = s.charAt(i-1);
            // 单独的情况
            if(ch1 != '0') {
                // 解码成功
                dp[i] += dp[i-1];
            }

            // 联合的情况
            if((ch0 == '1' ) || (ch0 == '2' && ch1 <= '6'))  {
                dp[i] += dp[i-2];
            }

        }

        return dp[n];
    }






}








 class StudentGradeSystemUI {
    private JFrame mainFrame;
    private JPanel mainPanel;
    private JLabel titleLabel;
    private JLabel nameLabel;
    private JLabel idLabel;
    private JLabel gradeLabel;
    private JTextField nameField;
    private JTextField idField;
    private JTextField gradeField;
    private JButton addButton;
    private JButton deleteButton;
    private JButton updateButton;
    private JTable gradeTable;

    public StudentGradeSystemUI() {
        // 初始化主窗口和面板
        mainFrame = new JFrame("学生成绩管理系统");
        mainFrame.setSize(600, 400);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainPanel = new JPanel(new BorderLayout());

        // 添加标题
        titleLabel = new JLabel("学生成绩管理系统");
        titleLabel.setFont(new Font("宋体", Font.BOLD, 24));
        titleLabel.setHorizontalAlignment(SwingConstants.CENTER);
        mainPanel.add(titleLabel, BorderLayout.NORTH);

        // 添加输入框和标签
        JPanel inputPanel = new JPanel(new GridLayout(3, 2));
        nameLabel = new JLabel("姓名：");
        idLabel = new JLabel("学号：");
        gradeLabel = new JLabel("成绩：");
        nameField = new JTextField();
        idField = new JTextField();
        gradeField = new JTextField();
        inputPanel.add(nameLabel);
        inputPanel.add(nameField);
        inputPanel.add(idLabel);
        inputPanel.add(idField);
        inputPanel.add(gradeLabel);
        inputPanel.add(gradeField);
        mainPanel.add(inputPanel, BorderLayout.WEST);

        // 添加按钮
        JPanel buttonPanel = new JPanel(new GridLayout(3, 1));
        addButton = new JButton("添加");
        deleteButton = new JButton("删除");
        updateButton = new JButton("更新");
        buttonPanel.add(addButton);
        buttonPanel.add(deleteButton);
        buttonPanel.add(updateButton);
        mainPanel.add(buttonPanel, BorderLayout.EAST);

        // 添加表格
        Object[][] data = {{"张三", "001", 80}, {"李四", "002", 90}, {"王五", "003", 85}};
        String[] columnNames = {"姓名", "学号", "成绩"};
        gradeTable = new JTable(data, columnNames);
        JScrollPane tableScrollPane = new JScrollPane(gradeTable);
        mainPanel.add(tableScrollPane, BorderLayout.CENTER);

        // 显示窗口
        mainFrame.getContentPane().add(mainPanel);
        mainFrame.setVisible(true);
    }

    public static void main(String[] args) {
        new StudentGradeSystemUI();
    }
}





class StudentGradeManagementSystem1 {

    public static void main(String[] args) {
        JFrame frame = new JFrame("学生成绩管理系统");
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        frame.add(panel);
        placeComponents(panel);

        frame.setVisible(true);
    }

    private static void placeComponents(JPanel panel) {
        panel.setLayout(null);

        JLabel nameLabel = new JLabel("学生姓名:");
        nameLabel.setBounds(50, 20, 80, 25);
        panel.add(nameLabel);

        JTextField nameText = new JTextField(20);
        nameText.setBounds(150, 20, 165, 25);
        panel.add(nameText);

        JLabel gradeLabel = new JLabel("学生成绩:");
        gradeLabel.setBounds(50, 50, 80, 25);
        panel.add(gradeLabel);

        JTextField gradeText = new JTextField(20);
        gradeText.setBounds(150, 50, 165, 25);
        panel.add(gradeText);

        JButton submitButton = new JButton("提交");
        submitButton.setBounds(150, 80, 80, 25);
        panel.add(submitButton);

        submitButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String name = nameText.getText();
                String grade = gradeText.getText();

                // 这里可以将学生姓名和成绩保存到数据库或进行其他操作
                System.out.println("学生姓名: " + name);
                System.out.println("学生成绩: " + grade);
            }
        });
    }
}









class StudentGradeManagementSystem {

    private static Map<String, Integer> studentGrades = new HashMap<>();

    public static void main(String[] args) {
        JFrame frame = new JFrame("学生成绩管理系统");
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        frame.add(panel);
        placeComponents(panel);

        frame.setVisible(true);
    }

    private static void placeComponents(JPanel panel) {
        panel.setLayout(null);

        JLabel nameLabel = new JLabel("学生姓名:");
        nameLabel.setBounds(50, 20, 80, 25);
        panel.add(nameLabel);

        JTextField nameText = new JTextField(20);
        nameText.setBounds(150, 20, 165, 25);
        panel.add(nameText);

        JLabel gradeLabel = new JLabel("学生成绩:");
        gradeLabel.setBounds(50, 50, 80, 25);
        panel.add(gradeLabel);

        JTextField gradeText = new JTextField(20);
        gradeText.setBounds(150, 50, 165, 25);
        panel.add(gradeText);

        JButton addButton = new JButton("增加");
        addButton.setBounds(50, 80, 80, 25);
        panel.add(addButton);

        JButton deleteButton = new JButton("删除");
        deleteButton.setBounds(150, 80, 80, 25);
        panel.add(deleteButton);

        JButton updateButton = new JButton("修改");
        updateButton.setBounds(250, 80, 80, 25);
        panel.add(updateButton);

        JButton searchButton = new JButton("查询");
        searchButton.setBounds(150, 110, 80, 25);
        panel.add(searchButton);

        JTextArea resultArea = new JTextArea();
        resultArea.setBounds(50, 140, 300, 100);
        panel.add(resultArea);

        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String name = nameText.getText();
                int grade = Integer.parseInt(gradeText.getText());
                studentGrades.put(name, grade);
                resultArea.setText("学生信息已添加");


            }
        });

        deleteButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String name = nameText.getText();
                studentGrades.remove(name);
                resultArea.setText("学生信息已删除");


            }
        });

        updateButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String name = nameText.getText();
                int grade = Integer.parseInt(gradeText.getText());
                studentGrades.put(name, grade);
                resultArea.setText("学生成绩已修改");
            }
        });

        searchButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String name = nameText.getText();
                Integer grade = studentGrades.get(name);
                if (grade != null) {
                    resultArea.setText(name + " 的成绩为: " + grade);
                } else {
                    resultArea.setText("未找到该学生信息");
                }
            }
        });
    }
}